Remove dependency on gperf. (#631)
authorGPSBabel <gpsbabel@users.noreply.github.com>
Mon, 24 Aug 2020 03:15:29 +0000 (22:15 -0500)
committerGitHub <noreply@github.com>
Mon, 24 Aug 2020 03:15:29 +0000 (22:15 -0500)
* Remove dependency on gperf.

There may be more "computer sciency" ways to do this, but let's start here.
Smallest cut possible for removal. Throwing this into CI to plan for actual
removal.

It seems like xcsv_tokens should be more const-able (constexpr?). If necessary,
we can defer this initialization from a global created at startup to being
only inflated when needed. Let's see.

* Bludgeon in temporary better handling for LAT_10E and friends.

* Prepare to die!

* Drop xcsv_tokens.cc and xcsv_tokens.gperf.

* Drop xcsv_tokens.in.

* Remove Steven's shiny new code to run gperf.

Collision with trunk. Oops.

* Pick up xcsv.cc, xcsv.h which were dropped.

GPSBabel.pro
xcsv.cc
xcsv.h
xcsv_tokens.gperf [deleted file]
xcsv_tokens.in [deleted file]

index 0c21620f803eada9a2fe9bdfb36cffeac98c173e..5ca3d54dc7864c5b1a02e49ede2011e80c46b146 100644 (file)
@@ -210,27 +210,6 @@ win32-msvc* {
   QMAKE_EXTRA_COMPILERS += styles
 }
 
-win32-msvc* {
-  # assume gperf not available.
-  HEADERS += xcsv_tokens.gperf
-} else {
-  TOKEN_FILES = $${PWD}/xcsv_tokens.in
-  equals(PWD, $${OUT_PWD}) {
-    tokens.commands += gperf --output-file=xcsv_tokens.gperf -L C++ -D -t xcsv_tokens.in
-  } else {
-    # Require in source builds.
-    # The the output must be checked in and the output depends on
-    # the --output-file parameter and the input file.
-    tokens.commands += echo "compilation of xcsv_tokens is not supported for out of source builds.";
-    tokens.commands += exit 1;
-  }
-  tokens.CONFIG += no_link no_clean
-  tokens.input = TOKEN_FILES
-  tokens.output = $${PWD}/xcsv_tokens.gperf
-  tokens.variable_out = HEADERS
-  QMAKE_EXTRA_COMPILERS += tokens
-}
-
 load(configure)
 
 CONFIG(release, debug|release): DEFINES *= NDEBUG
diff --git a/xcsv.cc b/xcsv.cc
index 9b390729230fac7af436b4d1bbeb88f25d1a5189..e105ca8886f20881dbaac27617f72685b4c997f7 100644 (file)
--- a/xcsv.cc
+++ b/xcsv.cc
 
 #define MYNAME "XCSV"
 
-/*
- * Internal numeric value to associate with each keyword in a style file.
- * To add new keywords, just add an entry here, handle it in the switch
- * statements below, add it to xcsv_tokens.in, and rebuild on a system
- * that has GNU gperf on it.
- */
-enum xcsv_token {
-  XT_unused = 0,
-  XT_ALT_FEET,
-  XT_ALT_METERS,
-  XT_ANYNAME,
-  XT_CADENCE,
-  XT_CITY,
-  XT_CONSTANT,
-  XT_COUNTRY,
-  XT_DESCRIPTION,
-  XT_EMAIL,
-  XT_EXCEL_TIME,
-  XT_FACILITY,
-  XT_FILENAME,
-  XT_FORMAT,
-  XT_GEOCACHE_CONTAINER,
-  XT_GEOCACHE_DIFF,
-  XT_GEOCACHE_HINT,
-  XT_GEOCACHE_LAST_FOUND,
-  XT_GEOCACHE_PLACER,
-  XT_GEOCACHE_TERR,
-  XT_GEOCACHE_TYPE,
-  XT_GEOCACHE_ISAVAILABLE,
-  XT_GEOCACHE_ISARCHIVED,
-  XT_GMT_TIME,
-  XT_GPS_FIX,
-  XT_GPS_HDOP,
-  XT_GPS_PDOP,
-  XT_GPS_SAT,
-  XT_GPS_VDOP,
-  XT_HEART_RATE,
-  XT_HMSG_TIME,
-  XT_HMSL_TIME,
-  XT_ICON_DESCR,
-  XT_IGNORE,
-  XT_INDEX,
-  XT_ISO_TIME,
-  XT_ISO_TIME_MS,
-  XT_LATLON_HUMAN_READABLE,
-  XT_LAT_DECIMAL,
-  XT_LAT_DECIMALDIR,
-  XT_LAT_DIR,
-  XT_LAT_DIRDECIMAL,
-  XT_LAT_HUMAN_READABLE,
-  XT_LAT_INT32DEG,
-  XT_LAT_DDMMDIR,
-  XT_LAT_NMEA,
-  XT_LOCAL_TIME,
-  XT_LON_DECIMAL,
-  XT_LON_DECIMALDIR,
-  XT_LON_DIR,
-  XT_LON_DIRDECIMAL,
-  XT_LON_HUMAN_READABLE,
-  XT_LON_INT32DEG,
-  XT_LON_DDMMDIR,
-  XT_LON_NMEA,
-  XT_MAP_EN_BNG,
-  XT_NOTES,
-  XT_NET_TIME,
-  XT_PATH_COURSE,
-  XT_PATH_DISTANCE_KM,
-  XT_PATH_DISTANCE_METERS,
-  XT_PATH_DISTANCE_MILES,
-  XT_PATH_SPEED,
-  XT_PATH_SPEED_KNOTS,
-  XT_PATH_SPEED_KPH,
-  XT_PATH_SPEED_MPH,
-  XT_PHONE_NR,
-  XT_POSTAL_CODE,
-  XT_POWER,
-  XT_ROUTE_NAME,
-  XT_SHORTNAME,
-  XT_STATE,
-  XT_STREET_ADDR,
-  XT_TEMPERATURE,
-  XT_TEMPERATURE_F,
-  XT_TIMET_TIME,
-  XT_TIMET_TIME_MS,
-  XT_TRACK_NAME,
-  XT_TRACK_NEW,
-  XT_URL,
-  XT_UTM,
-  XT_UTM_ZONE,
-  XT_UTM_ZONEC,
-  XT_UTM_ZONEF,
-  XT_UTM_EASTING,
-  XT_UTM_NORTHING,
-  XT_URL_LINK_TEXT,
-  XT_YYYYMMDD_TIME
-};
-
-#include "xcsv_tokens.gperf"          // for Perfect_Hash, xt_mapping
-
 /* a table of config file constants mapped to chars */
 const XcsvStyle::char_map_t XcsvStyle::xcsv_char_table[] = {
   { "COMMA",           ","     },
@@ -234,9 +135,7 @@ XcsvStyle::xcsv_ifield_add(XcsvStyle* style, const QString& qkey, const QString&
   QByteArray val = qval.toUtf8();
   QByteArray pfc = qpfc.toUtf8();
 
-  struct xt_mapping* xm = Perfect_Hash::in_word_set(key.constData(), strlen(key.constData()));
-
-  field_map fmp(key, val, pfc, xm ? xm->xt_token : -1);
+  field_map fmp(key, val, pfc, xcsv_tokens.value(qkey));
   validate_fieldmap(fmp, false);
 
   style->ifields.append(fmp);
@@ -253,9 +152,7 @@ XcsvStyle::xcsv_ofield_add(XcsvStyle* style, const QString& qkey, const QString&
   QByteArray val = qval.toUtf8();
   QByteArray pfc = qpfc.toUtf8();
 
-  struct xt_mapping* xm = Perfect_Hash::in_word_set(key.constData(), strlen(key.constData()));
-
-  field_map fmp(key, val, pfc, xm ? xm->xt_token : -1, options);
+  field_map fmp(key, val, pfc, xcsv_tokens.value(qkey));
   validate_fieldmap(fmp, true);
 
   style->ofields.append(fmp);
@@ -810,7 +707,7 @@ XcsvFormat::xcsv_parse_val(const QString& value, Waypoint* wpt, const XcsvStyle:
     garmin_fs_t::set_email(gmsd, csv_stringtrim(value, enclosure, 0));
   }
   break;
-  case -1:
+  case XT_unused:
     if (strncmp(fmp.key.constData(), "LON_10E", 7) == 0) {
       wpt->longitude = atof(s) / pow(10.0, atof(fmp.key.constData()+7));
     } else if (strncmp(fmp.key.constData(), "LAT_10E", 7) == 0) {
@@ -821,7 +718,7 @@ XcsvFormat::xcsv_parse_val(const QString& value, Waypoint* wpt, const XcsvStyle:
     break;
 
   default:
-    fatal("This can't happen\n");
+    fatal("Unknown style directive: %s - %d\n", fmp.key.constData(), fmp.hashed_key);
     break;
   }
 }
@@ -1535,7 +1432,7 @@ XcsvFormat::xcsv_waypt_pr(const Waypoint* wpt)
     case XT_FORMAT:
       buff = QString::asprintf(fmp.printfc.constData(), CSTR(wpt->session->name));
       break;
-    case -1:
+    case XT_unused:
       if (strncmp(fmp.key.constData(), "LON_10E", 7) == 0) {
         buff = QString::asprintf(fmp.printfc.constData(), lon * pow(10.0, atof(fmp.key.constData()+7)));
       } else if (strncmp(fmp.key.constData(), "LAT_10E", 7) == 0) {
diff --git a/xcsv.h b/xcsv.h
index 07885b4a536a66f212b7575bd5851806d5fe7eb4..b0bb684acc74b3b8297c80ce8eb05143e15cac2a 100644 (file)
--- a/xcsv.h
+++ b/xcsv.h
@@ -26,6 +26,7 @@
 
 #include <QtCore/QByteArray>      // for QByteArray
 #include <QtCore/QDateTime>       // for QDateTime
+#include <QtCore/QHash>           // for QHash
 #include <QtCore/QList>           // for QList
 #include <QtCore/QString>         // for QString
 #include <QtCore/QStringList>     // for QStringList
 
 #if CSVFMTS_ENABLED
 
+/*
+ * Internal numeric value to associate with each keyword in a style file.
+ * To add new keywords, just add an entry here, add it to xcsv_tokens, and
+ * handle it in the switch statements in xcsv.cc.
+ */
+enum xcsv_token {
+  XT_unused = 0,
+  XT_ALT_FEET,
+  XT_ALT_METERS,
+  XT_ANYNAME,
+  XT_CADENCE,
+  XT_CITY,
+  XT_CONSTANT,
+  XT_COUNTRY,
+  XT_DESCRIPTION,
+  XT_EMAIL,
+  XT_EXCEL_TIME,
+  XT_FACILITY,
+  XT_FILENAME,
+  XT_FORMAT,
+  XT_GEOCACHE_CONTAINER,
+  XT_GEOCACHE_DIFF,
+  XT_GEOCACHE_HINT,
+  XT_GEOCACHE_LAST_FOUND,
+  XT_GEOCACHE_PLACER,
+  XT_GEOCACHE_TERR,
+  XT_GEOCACHE_TYPE,
+  XT_GEOCACHE_ISAVAILABLE,
+  XT_GEOCACHE_ISARCHIVED,
+  XT_GMT_TIME,
+  XT_GPS_FIX,
+  XT_GPS_HDOP,
+  XT_GPS_PDOP,
+  XT_GPS_SAT,
+  XT_GPS_VDOP,
+  XT_HEART_RATE,
+  XT_HMSG_TIME,
+  XT_HMSL_TIME,
+  XT_ICON_DESCR,
+  XT_IGNORE,
+  XT_INDEX,
+  XT_ISO_TIME,
+  XT_ISO_TIME_MS,
+  XT_LATLON_HUMAN_READABLE,
+  XT_LAT_DECIMAL,
+  XT_LAT_DECIMALDIR,
+  XT_LAT_DIR,
+  XT_LAT_DIRDECIMAL,
+  XT_LAT_HUMAN_READABLE,
+  XT_LAT_INT32DEG,
+  XT_LAT_DDMMDIR,
+  XT_LAT_NMEA,
+  XT_LOCAL_TIME,
+  XT_LON_DECIMAL,
+  XT_LON_DECIMALDIR,
+  XT_LON_DIR,
+  XT_LON_DIRDECIMAL,
+  XT_LON_HUMAN_READABLE,
+  XT_LON_INT32DEG,
+  XT_LON_DDMMDIR,
+  XT_LON_NMEA,
+  XT_MAP_EN_BNG,
+  XT_NOTES,
+  XT_NET_TIME,
+  XT_PATH_COURSE,
+  XT_PATH_DISTANCE_KM,
+  XT_PATH_DISTANCE_METERS,
+  XT_PATH_DISTANCE_MILES,
+  XT_PATH_SPEED,
+  XT_PATH_SPEED_KNOTS,
+  XT_PATH_SPEED_KPH,
+  XT_PATH_SPEED_MPH,
+  XT_PHONE_NR,
+  XT_POSTAL_CODE,
+  XT_POWER,
+  XT_ROUTE_NAME,
+  XT_SHORTNAME,
+  XT_STATE,
+  XT_STREET_ADDR,
+  XT_TEMPERATURE,
+  XT_TEMPERATURE_F,
+  XT_TIMET_TIME,
+  XT_TIMET_TIME_MS,
+  XT_TRACK_NAME,
+  XT_TRACK_NEW,
+  XT_URL,
+  XT_UTM,
+  XT_UTM_ZONE,
+  XT_UTM_ZONEC,
+  XT_UTM_ZONEF,
+  XT_UTM_EASTING,
+  XT_UTM_NORTHING,
+  XT_URL_LINK_TEXT,
+  XT_YYYYMMDD_TIME
+};
+
+const QHash<QString, xcsv_token> xcsv_tokens {
+  { "ALT_FEET", XT_ALT_FEET },
+  { "ALT_METERS", XT_ALT_METERS },
+  { "ANYNAME", XT_ANYNAME },
+  { "CADENCE", XT_CADENCE },
+  { "CITY", XT_CITY },
+  { "CONSTANT", XT_CONSTANT },
+  { "COUNTRY", XT_COUNTRY },
+  { "DESCRIPTION", XT_DESCRIPTION },
+  { "EMAIL", XT_EMAIL },
+  { "EXCEL_TIME", XT_EXCEL_TIME },
+  { "FACILITY", XT_FACILITY },
+  { "FILENAME", XT_FILENAME },
+  { "FORMAT", XT_FORMAT },
+  { "GEOCACHE_CONTAINER", XT_GEOCACHE_CONTAINER },
+  { "GEOCACHE_DIFF", XT_GEOCACHE_DIFF },
+  { "GEOCACHE_HINT", XT_GEOCACHE_HINT },
+  { "GEOCACHE_ISARCHIVED", XT_GEOCACHE_ISARCHIVED },
+  { "GEOCACHE_ISAVAILABLE", XT_GEOCACHE_ISAVAILABLE },
+  { "GEOCACHE_LAST_FOUND", XT_GEOCACHE_LAST_FOUND },
+  { "GEOCACHE_PLACER", XT_GEOCACHE_PLACER },
+  { "GEOCACHE_TERR", XT_GEOCACHE_TERR },
+  { "GEOCACHE_TYPE", XT_GEOCACHE_TYPE },
+  { "GMT_TIME", XT_GMT_TIME },
+  { "GPS_FIX", XT_GPS_FIX },
+  { "GPS_HDOP", XT_GPS_HDOP },
+  { "GPS_PDOP", XT_GPS_PDOP },
+  { "GPS_SAT", XT_GPS_SAT },
+  { "GPS_VDOP", XT_GPS_VDOP },
+  { "HEART_RATE", XT_HEART_RATE },
+  { "HMSG_TIME", XT_HMSG_TIME },
+  { "HMSL_TIME", XT_HMSL_TIME },
+  { "ICON_DESCR", XT_ICON_DESCR },
+  { "IGNORE", XT_IGNORE },
+  { "INDEX", XT_INDEX },
+  { "ISO_TIME", XT_ISO_TIME },
+  { "ISO_TIME_MS", XT_ISO_TIME_MS },
+  { "LATLON_HUMAN_READABLE", XT_LATLON_HUMAN_READABLE },
+  { "LAT_DDMMDIR", XT_LAT_DDMMDIR },
+  { "LAT_DECIMAL", XT_LAT_DECIMAL },
+  { "LAT_DECIMALDIR", XT_LAT_DECIMALDIR },
+  { "LAT_DIR", XT_LAT_DIR },
+  { "LAT_DIRDECIMAL", XT_LAT_DIRDECIMAL },
+  { "LAT_HUMAN_READABLE", XT_LAT_HUMAN_READABLE },
+  { "LAT_INT32DEG", XT_LAT_INT32DEG },
+  { "LAT_NMEA", XT_LAT_NMEA },
+  { "LOCAL_TIME", XT_LOCAL_TIME },
+  { "LON_DDMMDIR", XT_LON_DDMMDIR },
+  { "LON_DECIMAL", XT_LON_DECIMAL },
+  { "LON_DECIMALDIR", XT_LON_DECIMALDIR },
+  { "LON_DIR", XT_LON_DIR },
+  { "LON_DIRDECIMAL", XT_LON_DIRDECIMAL },
+  { "LON_HUMAN_READABLE", XT_LON_HUMAN_READABLE },
+  { "LON_INT32DEG", XT_LON_INT32DEG },
+  { "LON_NMEA", XT_LON_NMEA },
+  { "MAP_EN_BNG", XT_MAP_EN_BNG },
+  { "NET_TIME", XT_NET_TIME },
+  { "NOTES", XT_NOTES },
+  { "PATH_COURSE", XT_PATH_COURSE },
+  { "PATH_DISTANCE_KM", XT_PATH_DISTANCE_KM },
+  { "PATH_DISTANCE_METERS", XT_PATH_DISTANCE_METERS },
+  { "PATH_DISTANCE_MILES", XT_PATH_DISTANCE_MILES },
+  { "PATH_SPEED", XT_PATH_SPEED },
+  { "PATH_SPEED_KNOTS", XT_PATH_SPEED_KNOTS },
+  { "PATH_SPEED_KPH", XT_PATH_SPEED_KPH },
+  { "PATH_SPEED_MPH", XT_PATH_SPEED_MPH },
+  { "PHONE_NR", XT_PHONE_NR },
+  { "POSTAL_CODE", XT_POSTAL_CODE },
+  { "POWER", XT_POWER },
+  { "ROUTE_NAME", XT_ROUTE_NAME },
+  { "SHORTNAME", XT_SHORTNAME },
+  { "STATE", XT_STATE },
+  { "STREET_ADDR", XT_STREET_ADDR },
+  { "TEMPERATURE", XT_TEMPERATURE },
+  { "TEMPERATURE_F", XT_TEMPERATURE_F },
+  { "TIMET_TIME", XT_TIMET_TIME },
+  { "TIMET_TIME_MS", XT_TIMET_TIME_MS },
+  { "TRACK_NAME", XT_TRACK_NAME },
+  { "TRACK_NEW", XT_TRACK_NEW },
+  { "URL", XT_URL },
+  { "URL_LINK_TEXT", XT_URL_LINK_TEXT },
+  { "UTM", XT_UTM },
+  { "UTM_EASTING", XT_UTM_EASTING },
+  { "UTM_NORTHING", XT_UTM_NORTHING },
+  { "UTM_ZONE", XT_UTM_ZONE },
+  { "UTM_ZONEC", XT_UTM_ZONEC },
+  { "UTM_ZONEF", XT_UTM_ZONEF },
+  { "YYYYMMDD_TIME", XT_YYYYMMDD_TIME }
+};
+
 /*
  * Class describing an xcsv format.
  */
diff --git a/xcsv_tokens.gperf b/xcsv_tokens.gperf
deleted file mode 100644 (file)
index 235530e..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-/* C++ code produced by gperf version 3.1 */
-/* Command-line: gperf --output-file=xcsv_tokens.gperf -L C++ -D -t xcsv_tokens.in  */
-/* Computed positions: -k'2,4-5,12,$' */
-
-#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
-      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
-      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
-      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
-      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
-      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
-      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
-      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
-      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
-      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
-      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
-      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
-      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
-      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
-      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
-      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
-      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
-      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
-      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
-      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
-      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
-      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
-      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
-/* The character set is not based on ISO-646.  */
-#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gperf@gnu.org>."
-#endif
-
-#line 1 "xcsv_tokens.in"
-struct xt_mapping {const char *name; int xt_token; };
-
-#define TOTAL_KEYWORDS 87
-#define MIN_WORD_LENGTH 3
-#define MAX_WORD_LENGTH 21
-#define MIN_HASH_VALUE 7
-#define MAX_HASH_VALUE 248
-/* maximum key range = 242, duplicates = 0 */
-
-class Perfect_Hash
-{
-private:
-  static inline unsigned int hash (const char *str, size_t len);
-public:
-  static struct xt_mapping *in_word_set (const char *str, size_t len);
-};
-
-inline unsigned int
-Perfect_Hash::hash (const char *str, size_t len)
-{
-  static unsigned char asso_values[] =
-    {
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249,   0, 249,  25,   0,   0,
-       10,  90,  60,  25, 249,  30,  65,  25,  20,   5,
-       80, 249,   0,  70,  15, 249,   0,   0,  40,  30,
-       85, 249, 249, 249, 249,   0, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-      249, 249, 249, 249, 249, 249
-    };
-  unsigned int hval = len;
-
-  switch (hval)
-    {
-      default:
-        hval += asso_values[static_cast<unsigned char>(str[11])];
-      /*FALLTHROUGH*/
-      case 11:
-      case 10:
-      case 9:
-      case 8:
-      case 7:
-      case 6:
-      case 5:
-        hval += asso_values[static_cast<unsigned char>(str[4])];
-      /*FALLTHROUGH*/
-      case 4:
-        hval += asso_values[static_cast<unsigned char>(str[3])];
-      /*FALLTHROUGH*/
-      case 3:
-      case 2:
-        hval += asso_values[static_cast<unsigned char>(str[1])];
-        break;
-    }
-  return hval + asso_values[static_cast<unsigned char>(str[len - 1])];
-}
-
-struct xt_mapping *
-Perfect_Hash::in_word_set (const char *str, size_t len)
-{
-  static struct xt_mapping wordlist[] =
-    {
-#line 42 "xcsv_tokens.in"
-      {"LAT_DIR", XT_LAT_DIR},
-#line 70 "xcsv_tokens.in"
-      {"POWER", XT_POWER},
-#line 46 "xcsv_tokens.in"
-      {"LAT_DDMMDIR", XT_LAT_DDMMDIR},
-#line 52 "xcsv_tokens.in"
-      {"LON_DIR", XT_LON_DIR},
-#line 39 "xcsv_tokens.in"
-      {"LAT_DECIMALDIR", XT_LAT_DECIMALDIR},
-#line 55 "xcsv_tokens.in"
-      {"LON_DDMMDIR", XT_LON_DDMMDIR},
-#line 49 "xcsv_tokens.in"
-      {"LON_DECIMALDIR", XT_LON_DECIMALDIR},
-#line 59 "xcsv_tokens.in"
-      {"NET_TIME", XT_NET_TIME},
-#line 31 "xcsv_tokens.in"
-      {"HEART_RATE", XT_HEART_RATE},
-#line 74 "xcsv_tokens.in"
-      {"STREET_ADDR", XT_STREET_ADDR},
-#line 6 "xcsv_tokens.in"
-      {"CADENCE", XT_CADENCE},
-#line 47 "xcsv_tokens.in"
-      {"LAT_NMEA", XT_LAT_NMEA},
-#line 71 "xcsv_tokens.in"
-      {"ROUTE_NAME", XT_ROUTE_NAME},
-#line 69 "xcsv_tokens.in"
-      {"POSTAL_CODE", XT_POSTAL_CODE},
-#line 56 "xcsv_tokens.in"
-      {"LON_NMEA", XT_LON_NMEA},
-#line 73 "xcsv_tokens.in"
-      {"STATE", XT_STATE},
-#line 23 "xcsv_tokens.in"
-      {"GEOCACHE_TERR", XT_GEOCACHE_TERR},
-#line 22 "xcsv_tokens.in"
-      {"GEOCACHE_PLACER", XT_GEOCACHE_PLACER},
-#line 83 "xcsv_tokens.in"
-      {"UTM", XT_UTM},
-#line 19 "xcsv_tokens.in"
-      {"GEOCACHE_ISARCHIVED", XT_GEOCACHE_ISARCHIVED},
-#line 20 "xcsv_tokens.in"
-      {"GEOCACHE_ISAVAILABLE", XT_GEOCACHE_ISAVAILABLE},
-#line 5 "xcsv_tokens.in"
-      {"ANYNAME", XT_ANYNAME},
-#line 25 "xcsv_tokens.in"
-      {"GMT_TIME", XT_GMT_TIME},
-#line 77 "xcsv_tokens.in"
-      {"TIMET_TIME", XT_TIMET_TIME},
-#line 15 "xcsv_tokens.in"
-      {"FORMAT", XT_FORMAT},
-#line 14 "xcsv_tokens.in"
-      {"FILENAME", XT_FILENAME},
-#line 34 "xcsv_tokens.in"
-      {"ICON_DESCR", XT_ICON_DESCR},
-#line 10 "xcsv_tokens.in"
-      {"DESCRIPTION", XT_DESCRIPTION},
-#line 17 "xcsv_tokens.in"
-      {"GEOCACHE_DIFF", XT_GEOCACHE_DIFF},
-#line 16 "xcsv_tokens.in"
-      {"GEOCACHE_CONTAINER", XT_GEOCACHE_CONTAINER},
-#line 80 "xcsv_tokens.in"
-      {"TRACK_NEW", XT_TRACK_NEW},
-#line 79 "xcsv_tokens.in"
-      {"TRACK_NAME", XT_TRACK_NAME},
-#line 82 "xcsv_tokens.in"
-      {"URL", XT_URL},
-#line 67 "xcsv_tokens.in"
-      {"PATH_SPEED", XT_PATH_SPEED},
-#line 60 "xcsv_tokens.in"
-      {"PATH_COURSE", XT_PATH_COURSE},
-#line 18 "xcsv_tokens.in"
-      {"GEOCACHE_HINT", XT_GEOCACHE_HINT},
-#line 40 "xcsv_tokens.in"
-      {"LAT_DECIMAL", XT_LAT_DECIMAL},
-#line 9 "xcsv_tokens.in"
-      {"COUNTRY", XT_COUNTRY},
-#line 43 "xcsv_tokens.in"
-      {"LAT_HUMAN_READABLE", XT_LAT_HUMAN_READABLE},
-#line 48 "xcsv_tokens.in"
-      {"LOCAL_TIME", XT_LOCAL_TIME},
-#line 50 "xcsv_tokens.in"
-      {"LON_DECIMAL", XT_LON_DECIMAL},
-#line 53 "xcsv_tokens.in"
-      {"LON_HUMAN_READABLE", XT_LON_HUMAN_READABLE},
-#line 72 "xcsv_tokens.in"
-      {"SHORTNAME", XT_SHORTNAME},
-#line 68 "xcsv_tokens.in"
-      {"PHONE_NR", XT_PHONE_NR},
-#line 7 "xcsv_tokens.in"
-      {"CITY", XT_CITY},
-#line 75 "xcsv_tokens.in"
-      {"TEMPERATURE", XT_TEMPERATURE},
-#line 38 "xcsv_tokens.in"
-      {"ISO_TIME", XT_ISO_TIME},
-#line 3 "xcsv_tokens.in"
-      {"ALT_FEET", XT_ALT_FEET},
-#line 33 "xcsv_tokens.in"
-      {"HMSL_TIME", XT_HMSL_TIME},
-#line 57 "xcsv_tokens.in"
-      {"MAP_EN_BNG", XT_MAP_EN_BNG},
-#line 35 "xcsv_tokens.in"
-      {"IGNORE", XT_IGNORE},
-#line 76 "xcsv_tokens.in"
-      {"TEMPERATURE_F", XT_TEMPERATURE_F},
-#line 41 "xcsv_tokens.in"
-      {"LAT_DIRDECIMAL", XT_LAT_DIRDECIMAL},
-#line 36 "xcsv_tokens.in"
-      {"INDEX", XT_INDEX},
-#line 84 "xcsv_tokens.in"
-      {"UTM_ZONE", XT_UTM_ZONE},
-#line 51 "xcsv_tokens.in"
-      {"LON_DIRDECIMAL", XT_LON_DIRDECIMAL},
-#line 45 "xcsv_tokens.in"
-      {"LATLON_HUMAN_READABLE", XT_LATLON_HUMAN_READABLE},
-#line 8 "xcsv_tokens.in"
-      {"CONSTANT", XT_CONSTANT},
-#line 21 "xcsv_tokens.in"
-      {"GEOCACHE_LAST_FOUND", XT_GEOCACHE_LAST_FOUND},
-#line 12 "xcsv_tokens.in"
-      {"EXCEL_TIME", XT_EXCEL_TIME},
-#line 87 "xcsv_tokens.in"
-      {"UTM_EASTING", XT_UTM_EASTING},
-#line 24 "xcsv_tokens.in"
-      {"GEOCACHE_TYPE", XT_GEOCACHE_TYPE},
-#line 86 "xcsv_tokens.in"
-      {"UTM_ZONEF", XT_UTM_ZONEF},
-#line 89 "xcsv_tokens.in"
-      {"YYYYMMDD_TIME", XT_YYYYMMDD_TIME},
-#line 32 "xcsv_tokens.in"
-      {"HMSG_TIME", XT_HMSG_TIME},
-#line 61 "xcsv_tokens.in"
-      {"PATH_DISTANCE_KM", XT_PATH_DISTANCE_KM},
-#line 13 "xcsv_tokens.in"
-      {"FACILITY", XT_FACILITY},
-#line 81 "xcsv_tokens.in"
-      {"URL_LINK_TEXT", XT_URL_LINK_TEXT},
-#line 85 "xcsv_tokens.in"
-      {"UTM_ZONEC", XT_UTM_ZONEC},
-#line 26 "xcsv_tokens.in"
-      {"GPS_FIX", XT_GPS_FIX},
-#line 78 "xcsv_tokens.in"
-      {"TIMET_TIME_MS", XT_TIMET_TIME_MS},
-#line 58 "xcsv_tokens.in"
-      {"NOTES", XT_NOTES},
-#line 66 "xcsv_tokens.in"
-      {"PATH_SPEED_MPH", XT_PATH_SPEED_MPH},
-#line 65 "xcsv_tokens.in"
-      {"PATH_SPEED_KPH", XT_PATH_SPEED_KPH},
-#line 37 "xcsv_tokens.in"
-      {"ISO_TIME_MS", XT_ISO_TIME_MS},
-#line 30 "xcsv_tokens.in"
-      {"GPS_VDOP", XT_GPS_VDOP},
-#line 4 "xcsv_tokens.in"
-      {"ALT_METERS", XT_ALT_METERS},
-#line 29 "xcsv_tokens.in"
-      {"GPS_SAT", XT_GPS_SAT},
-#line 63 "xcsv_tokens.in"
-      {"PATH_DISTANCE_MILES", XT_PATH_DISTANCE_MILES},
-#line 62 "xcsv_tokens.in"
-      {"PATH_DISTANCE_METERS", XT_PATH_DISTANCE_METERS},
-#line 64 "xcsv_tokens.in"
-      {"PATH_SPEED_KNOTS", XT_PATH_SPEED_KNOTS},
-#line 11 "xcsv_tokens.in"
-      {"EMAIL", XT_EMAIL},
-#line 44 "xcsv_tokens.in"
-      {"LAT_INT32DEG", XT_LAT_INT32DEG},
-#line 54 "xcsv_tokens.in"
-      {"LON_INT32DEG", XT_LON_INT32DEG},
-#line 88 "xcsv_tokens.in"
-      {"UTM_NORTHING", XT_UTM_NORTHING},
-#line 27 "xcsv_tokens.in"
-      {"GPS_HDOP", XT_GPS_HDOP},
-#line 28 "xcsv_tokens.in"
-      {"GPS_PDOP", XT_GPS_PDOP}
-    };
-
-  static signed char lookup[] =
-    {
-      -1, -1, -1, -1, -1, -1, -1,  0, -1, -1,  1,  2,  3, -1,
-       4, -1,  5, -1, -1,  6, -1, -1, -1,  7, -1,  8,  9, 10,
-      11, -1, 12, 13, -1, 14, -1, 15, -1, -1, 16, -1, 17, -1,
-      -1, 18, 19, 20, -1, 21, 22, -1, 23, 24, -1, 25, -1, 26,
-      27, -1, 28, -1, -1, -1, -1, 29, 30, 31, -1, -1, 32, -1,
-      33, 34, -1, 35, -1, -1, 36, 37, 38, -1, 39, 40, -1, 41,
-      42, -1, -1, -1, 43, 44, -1, 45, -1, 46, -1, -1, -1, -1,
-      47, 48, 49, 50, -1, 51, 52, 53, -1, -1, 54, 55, -1, 56,
-      -1, 57, 58, 59, 60, -1, 61, 62, -1, -1, -1, 63, 64, -1,
-      65, -1, 66, -1, -1, -1, -1, 67, 68, -1, -1, 69, -1, -1,
-      -1, -1, -1, -1, -1, -1, -1, -1, 70, -1, 71, -1, -1, -1,
-      -1, -1, -1, -1, -1, 72, -1, -1, -1, -1, 73, -1, 74, -1,
-      75, -1, 76, -1, 77, -1, 78, 79, 80, -1, -1, -1, -1, -1,
-      -1, -1, -1, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-      -1, -1, -1, -1, -1, -1, -1, 82, -1, -1, -1, -1, 83, -1,
-      -1, -1, -1, 84, 85, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86
-    };
-
-  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
-    {
-      unsigned int key = hash (str, len);
-
-      if (key <= MAX_HASH_VALUE)
-        {
-          int index = lookup[key];
-
-          if (index >= 0)
-            {
-              const char *s = wordlist[index].name;
-
-              if (*str == *s && !strcmp (str + 1, s + 1))
-                return &wordlist[index];
-            }
-        }
-    }
-  return 0;
-}
diff --git a/xcsv_tokens.in b/xcsv_tokens.in
deleted file mode 100644 (file)
index aced51e..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-struct xt_mapping {const char *name; int xt_token; };
-%%
-ALT_FEET, XT_ALT_FEET
-ALT_METERS, XT_ALT_METERS
-ANYNAME, XT_ANYNAME
-CADENCE, XT_CADENCE
-CITY, XT_CITY
-CONSTANT, XT_CONSTANT
-COUNTRY, XT_COUNTRY
-DESCRIPTION, XT_DESCRIPTION
-EMAIL, XT_EMAIL
-EXCEL_TIME, XT_EXCEL_TIME
-FACILITY, XT_FACILITY
-FILENAME, XT_FILENAME
-FORMAT, XT_FORMAT
-GEOCACHE_CONTAINER, XT_GEOCACHE_CONTAINER
-GEOCACHE_DIFF, XT_GEOCACHE_DIFF
-GEOCACHE_HINT, XT_GEOCACHE_HINT
-GEOCACHE_ISARCHIVED, XT_GEOCACHE_ISARCHIVED
-GEOCACHE_ISAVAILABLE, XT_GEOCACHE_ISAVAILABLE
-GEOCACHE_LAST_FOUND, XT_GEOCACHE_LAST_FOUND
-GEOCACHE_PLACER, XT_GEOCACHE_PLACER
-GEOCACHE_TERR, XT_GEOCACHE_TERR
-GEOCACHE_TYPE, XT_GEOCACHE_TYPE
-GMT_TIME, XT_GMT_TIME
-GPS_FIX, XT_GPS_FIX
-GPS_HDOP, XT_GPS_HDOP
-GPS_PDOP, XT_GPS_PDOP
-GPS_SAT, XT_GPS_SAT
-GPS_VDOP, XT_GPS_VDOP
-HEART_RATE, XT_HEART_RATE
-HMSG_TIME, XT_HMSG_TIME
-HMSL_TIME, XT_HMSL_TIME
-ICON_DESCR, XT_ICON_DESCR
-IGNORE, XT_IGNORE
-INDEX, XT_INDEX
-ISO_TIME_MS, XT_ISO_TIME_MS
-ISO_TIME, XT_ISO_TIME
-LAT_DECIMALDIR, XT_LAT_DECIMALDIR
-LAT_DECIMAL, XT_LAT_DECIMAL
-LAT_DIRDECIMAL, XT_LAT_DIRDECIMAL
-LAT_DIR, XT_LAT_DIR
-LAT_HUMAN_READABLE, XT_LAT_HUMAN_READABLE
-LAT_INT32DEG, XT_LAT_INT32DEG
-LATLON_HUMAN_READABLE, XT_LATLON_HUMAN_READABLE
-LAT_DDMMDIR, XT_LAT_DDMMDIR
-LAT_NMEA, XT_LAT_NMEA
-LOCAL_TIME, XT_LOCAL_TIME
-LON_DECIMALDIR, XT_LON_DECIMALDIR
-LON_DECIMAL, XT_LON_DECIMAL
-LON_DIRDECIMAL, XT_LON_DIRDECIMAL
-LON_DIR, XT_LON_DIR
-LON_HUMAN_READABLE, XT_LON_HUMAN_READABLE
-LON_INT32DEG, XT_LON_INT32DEG
-LON_DDMMDIR, XT_LON_DDMMDIR
-LON_NMEA, XT_LON_NMEA
-MAP_EN_BNG, XT_MAP_EN_BNG
-NOTES, XT_NOTES
-NET_TIME, XT_NET_TIME
-PATH_COURSE, XT_PATH_COURSE
-PATH_DISTANCE_KM, XT_PATH_DISTANCE_KM
-PATH_DISTANCE_METERS, XT_PATH_DISTANCE_METERS
-PATH_DISTANCE_MILES, XT_PATH_DISTANCE_MILES
-PATH_SPEED_KNOTS, XT_PATH_SPEED_KNOTS
-PATH_SPEED_KPH, XT_PATH_SPEED_KPH
-PATH_SPEED_MPH, XT_PATH_SPEED_MPH
-PATH_SPEED, XT_PATH_SPEED
-PHONE_NR, XT_PHONE_NR
-POSTAL_CODE, XT_POSTAL_CODE
-POWER, XT_POWER
-ROUTE_NAME, XT_ROUTE_NAME
-SHORTNAME, XT_SHORTNAME
-STATE, XT_STATE
-STREET_ADDR, XT_STREET_ADDR
-TEMPERATURE, XT_TEMPERATURE
-TEMPERATURE_F, XT_TEMPERATURE_F
-TIMET_TIME, XT_TIMET_TIME
-TIMET_TIME_MS, XT_TIMET_TIME_MS
-TRACK_NAME, XT_TRACK_NAME
-TRACK_NEW, XT_TRACK_NEW
-URL_LINK_TEXT, XT_URL_LINK_TEXT
-URL, XT_URL
-UTM, XT_UTM
-UTM_ZONE, XT_UTM_ZONE
-UTM_ZONEC, XT_UTM_ZONEC
-UTM_ZONEF, XT_UTM_ZONEF
-UTM_EASTING, XT_UTM_EASTING
-UTM_NORTHING, XT_UTM_NORTHING
-YYYYMMDD_TIME, XT_YYYYMMDD_TIME